49. 数据框可视化

本章概览

  • 数据可视化:将抽象数据转换为图形表示的过程
  • 核心价值:模式发现、沟通工具、决策支持
  • Python可视化生态:Matplotlib + Seaborn + Pandas

为什么需要数据可视化?

  • 模式发现:人类视觉系统对模式和异常的识别能力远强于对数字表格的扫描
  • 沟通工具:一张精心设计的图表往往比千言万语更能传达数据洞察
  • 决策支持:可视化帮助决策者快速理解数据趋势,做出更明智的商业决策

可视化的本质:数据到图形的映射

  • 数据属性(数值、类别、时间)映射到视觉通道(位置、长度、颜色、形状)
  • 有效的可视化应遵循可视化曼哈顿原则:单位面积内编码尽可能多的信息,同时保持可读性

Python可视化工具栈

定位 特点
Matplotlib 底层绘图库 提供完整的控制能力
Seaborn 高级统计可视化 基于Matplotlib,专为统计图表设计
Pandas 快速绘图 .plot() 方法,一行代码出图

基础图表:折线图与柱状图

  • 折线图:展示数据的时间趋势和变化规律
  • 柱状图:比较不同类别之间的数据差异
  • 这是金融分析中最常用的两种图表类型

代码演示:折线图与柱状图

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei']

# 准备示例数据:公司5个月的销售额和利润
sales = pd.DataFrame({
    '月份': ['1月', '2月', '3月', '4月', '5月'],
    '销售额': [120, 150, 180, 140, 200],
    '利润': [30, 40, 50, 35, 60]
})

plt.figure(figsize=(12, 6))

# 折线图
plt.subplot(1, 2, 1)
plt.plot(sales['月份'], sales['销售额'], marker='o', linewidth=2)
plt.title('销售额趋势', fontsize=14)
plt.xlabel('月份', fontsize=12)
plt.ylabel('销售额(万元)', fontsize=12)
plt.grid(True, alpha=0.3)

# 柱状图
plt.subplot(1, 2, 2)
plt.bar(sales['月份'], sales['利润'], color='steelblue', alpha=0.7)
plt.title('利润对比', fontsize=14)
plt.xlabel('月份', fontsize=12)
plt.ylabel('利润(万元)', fontsize=12)
plt.grid(axis='y', alpha=0.3)

plt.tight_layout()
plt.show()
Listing 1: 基础图表绘制示例:折线图与柱状图

折线图关键参数解析

参数 含义 示例
marker 数据点标记形状 'o'(圆形), 's'(方形)
linewidth 线条宽度 2
alpha 透明度(0~1) 0.7
color 线条颜色 'steelblue'

柱状图关键参数解析

参数 含义 示例
color 柱子颜色 'steelblue'
alpha 透明度 0.7
grid(axis='y') 只显示Y轴网格 便于对比柱高

Seaborn高级统计图表

  • Seaborn 在 Matplotlib 基础上提供更高级的统计可视化
  • 特别适合展示数据的分布特征统计关系
  • 常用图表:箱线图、小提琴图

代码演示:箱线图与小提琴图

import seaborn as sns

plt.figure(figsize=(12, 6))

# 箱线图
plt.subplot(1, 2, 1)
sns.boxplot(data=sales, x='月份', y='销售额')
plt.title('销售额箱线图', fontsize=14)

# 小提琴图
plt.subplot(1, 2, 2)
sns.violinplot(data=sales, x='月份', y='销售额')
plt.title('销售额小提琴图', fontsize=14)

plt.tight_layout()
plt.show()
Listing 2: Seaborn高级统计图表:箱线图与小提琴图

箱线图如何解读?

  • 箱体:包含中间50%的数据(Q1到Q3)
  • 箱中横线:中位数
  • 上下须:数据的正常范围(非异常值)
  • 圆点:异常值(超出1.5倍IQR)

小提琴图如何解读?

  • 宽度:表示该位置数据点的密度
  • 较宽部分:数据更集中
  • 内部:包含箱线图元素,显示统计量
  • 结合了箱线图和核密度估计图的优势

散点图与回归分析

  • 散点图:探索两个数值变量之间关系的经典工具
  • 金融中广泛用于:股票价格与成交量、风险与收益等关系研究
  • 可添加回归线量化线性趋势

代码演示:散点图与回归线

import numpy as np

# 模拟两个相关的金融变量(如风险与收益)
x = np.random.randn(100) * 10 + 50
y = x * 0.8 + np.random.randn(100) * 5 + 30

plt.figure(figsize=(10, 6))

# Seaborn自动拟合OLS回归线并绘制置信区间
sns.regplot(x=x, y=y, scatter_kws={'alpha':0.6})

plt.title('散点图与回归线', fontsize=14)
plt.xlabel('X变量', fontsize=12)
plt.ylabel('Y变量', fontsize=12)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
Listing 3: 散点图与回归线

散点图解读要点

  • 每个点:代表一个观测样本
  • 回归线:显示x和y的整体线性趋势
  • 阴影区域:回归线的置信区间(不确定性范围)
  • sns.regplot() 自动完成OLS最小二乘拟合

相关性热力图

  • 热力图:用颜色编码矩阵元素值的可视化方法
  • 最适合展示相关性矩阵
  • 一目了然地看出哪些变量存在强相关关系

Pearson相关系数回顾

  • 取值范围:\([-1, 1]\)
  • \(1\):完全正相关
  • \(0\):无线性相关
  • \(-1\):完全负相关

代码演示:相关性热力图

# 准备示例数据
data = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [5, 4, 3, 2, 1],
    'C': [2, 3, 4, 5, 6],
    'D': [4, 5, 6, 7, 8]
})

# 计算Pearson相关系数矩阵
corr = data.corr()

plt.figure(figsize=(10, 8))

# 绘制热力图
sns.heatmap(
    corr,
    annot=True,
    cmap='coolwarm',
    center=0,
    linewidths=0.5,
    cbar_kws={'label': '相关系数'}
)

plt.title('特征相关性热力图', fontsize=14)
plt.tight_layout()
plt.show()
Listing 4: 相关性热力图

热力图解读要点

  • 颜色越红:正相关越强(接近1)
  • 颜色越蓝:负相关越强(接近-1)
  • 颜色接近白色:相关性较弱(接近0)
  • 对角线为1:自相关,总是完全相关

热力图关键参数

参数 含义
annot=True 在格子中显示数值
cmap='coolwarm' 蓝-红配色(冷-暖色)
center=0 0值为中间色
linewidths=0.5 格子间线宽

⭐ 平台任务解答代码

# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
#任务一
import matplotlib.pyplot as plt
import pandas as pd  # 导入Pandas数据分析库

plt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置Matplotlib全局参数
turnover = pd.read_excel("https://huoran.oss-cn-shenzhen.aliyuncs.com/1726219804739.xlsx",sheet_name="Sheet1")  #导入外部换手率数据并且是Sheet1工作表
turnover["日期"] = pd.to_datetime(turnover["日期"] , format='%Y%m%d')  # 转换为日期时间格式
turnover.set_index("日期",inplace=True)  # 将日期列设为turnover数据框的索引
turnover.head() #显示前五行
turnover.tail() #显示后五行
# 绘制换手率的折线图(显示时间趋势)
turnover.plot(kind="line",figsize=(9,6),title="2024年1月至2024年8月上证50指数换手率",grid=True,fontsize=13)
plt.savefig("1.png")  # 保存图形至文件

#任务二
import matplotlib.pyplot as plt
import pandas as pd  # 导入Pandas数据分析库
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置Matplotlib全局参数

# 从Excel文件读取数据存入volume
volume = pd.read_excel("https://huoran.oss-cn-shenzhen.aliyuncs.com/1726219804739.xlsx",sheet_name="Sheet2",header=0)  

volume["日期"] = pd.to_datetime(volume["日期"] , format='%Y%m%d')  # 转换为日期时间格式
volume.set_index("日期",inplace=True)  # 将日期列设为volume数据框的索引
# 绘制交易金额的直方图(展示分布特征)
volume.plot(kind="hist",figsize=(9,6),title="2024年1月至2024年9月上证50指数交易金额",grid=True,fontsize=13)
plt.savefig("1.png")  # 保存图形至文件


#任务三
import matplotlib.pyplot as plt
import pandas as pd  # 导入Pandas数据分析库
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置Matplotlib全局参数

# 从Excel文件读取数据存入volume
volume = pd.read_excel("https://huoran.oss-cn-shenzhen.aliyuncs.com/1726219804739.xlsx",sheet_name="Sheet2",header=0) 
volume["日期"] = pd.to_datetime(volume["日期"] , format='%Y%m%d')  # 转换为日期时间格式
volume.set_index("日期",inplace=True)  # 将日期列设为volume数据框的索引
volume.describe() #查看数据属性
# 绘制交易金额的箱线图(展示分位数和异常值)
volume.plot(kind="box",figsize=(9,6),title="2024年1月至2024年9月上证50指数交易金额",grid=True,fontsize=13)
plt.savefig("1.png")  # 保存图形至文件

#任务四
import matplotlib.pyplot as plt
import pandas as pd  # 导入Pandas数据分析库
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置Matplotlib全局参数

# 从Excel文件读取数据存入price
price = pd.read_excel("https://huoran.oss-cn-shenzhen.aliyuncs.com/1726219804739.xlsx",sheet_name="Sheet3")
price ["日期"] = pd.to_datetime(price["日期"] , format='%Y%m%d')  # 转换为日期时间格式
price.set_index("日期",inplace=True)  # 将日期列设为price数据框的索引
price.head()  # 查看price前5行数据
price.tail()  # 查看price后5行数据
price.plot(kind="line",subplots=True,sharex=True,sharey=True,layout=(2,2),figsize=(10,8),title="2024年1月至2024年9月上证50指数走势图",grid=True,fontsize=13) #2018年1月至2019年6月上证50指数走势图
plt.savefig("1.png")  # 保存图形至文件
Listing 5
(a)
(b)
(c)
(d)

本章小结

  • 折线图:展示时间趋势,用 plt.plot()df.plot(kind='line')
  • 柱状图:类别比较,用 plt.bar()
  • 箱线图/小提琴图:数据分布,用 sns.boxplot() / sns.violinplot()
  • 散点图+回归线:变量关系,用 sns.regplot()
  • 热力图:相关性矩阵,用 sns.heatmap()